The present invention relates to identifying a processor in a multiprocessor system. In particular it relates to identifying a processor and a value of a high frequency clock of the processor in a single indivisible operation.
A computer central processing unit (CPU) may include a high frequency clock. For example, such a high frequency clock can define a step in a fetch, decode and execute cycle for the processor. Such clocks are to be distinguished from other system clocks which provide date and time facilities for a computer system since high frequency clocks are updated at a relatively high frequency. The precise frequency of such a high frequency clock is dependent upon the operational clock speed of a particular processor. By way of example, a processor configured to operate at a clock speed above one gigahertz will include a high frequency clock capable of providing a timing resolution of the order of magnitude of a nanosecond. This compares with a system clock which may provide a resolution of a thousandth or less of such high frequency clocks.
High frequency clocks in CPUs can have many applications. For example, such clocks are useful for the precise measurement of elapsed time and therefore have useful applications in the measurement of performance statistics for computer programs executing in a processor. The high resolution of the clock allows the measurement of elapsed time for very short program fragments, such as fragments requiring only a few hundred processor cycles. A typical approach to such a measurement is illustrated in pseudo-code below:
start_time=getHighFrequencyClockTicks
<program fragment>
end_time=getHighFrequencyClockTicks
elapsed_time=end_time−start_time
The <program fragment> above is the program fragment for measurement.
The pseudo-code “getHighFrequencyClockTicks* corresponds to processor instructions to obtain a value of the high frequency clock and is typically implemented as a few instructions in order to avoid consuming a significant amount of processor time. For example, in the Intel IA32 processor,                getHighFrequencyClockTicks” corresponds to the RDTSC (read time stamp counter) instruction.        
Whilst the use of such high frequency clocks is advantageous for measuring elapsed time on a single processor, in a multiprocessor system problems can arise because it is not possible to guarantee that the clocks in each processor are synchronized in the sense that they express an identical clock time. The difference between a value of one processor clock and a value of another processor clock is termed clock skew. This characteristic of multiprocessor systems coupled with a possibility that a running program fragment can be switched between processors during execution makes it very difficult to accurately measure an elapsed time for a program. This arises because the start_time and end_time may be measured on different clocks in different CPUs. For example, the start_time may be measured on a clock in a processor on which the program fragment commenced execution, and the end_time may be measured on a clock in a processor on which the program fragment ceased execution. In this situation the elapsed time includes not only the time taken to execute the program fragment, but also the unwanted clock skew.
One solution to this problem is to identify the processor on which the program fragment commences execution and to identify the processor on which the program fragment ceased execution. In this way it is possible to determine when the elapsed time measurement is based on clock values for the same processor. For example, the pseudo-code could be amended to:
start_processor=getProcessorlD
start_time=getHighFrequencyClockTicks
<program fragment>
end_time=getHighFrequencyClockTicks
end_processor=getProcessorlD
elapsed_time=end_time−start_time
if start_processor=end_processor then elapsed_time is valid
Instructions are known for obtain an identifier for a processor (nominally indicated as “getProcessorlD”). However, such instructions are typically synchronising instructions which interfere with the measurement of time. Further, it is possible that the performance measurement program is switched to a different processor between the “getProcessorlD” instruction and the “getHighFrequencyClockTicks” instruction. Consequently, the “getHighFrequencyClockTicks” instruction will obtain a clock value for a processor which is different to the processor identified by the “getProcessorlD” instruction.